/* 
    重写数组的方法
    push,pop,shift,unshift,splice,sort,reverse
    为什么是这七种方法？————因为这七种方法可以改变原数组
*/
import { def } from './utils.js'

// 得到Array.prototype
const methodsToChange = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];
const arrayPrototype = Array.prototype;
export const arrayMathods = Object.create(arrayPrototype);
methodsToChange.forEach(methodName => {
    // 备份原来的方法
    const original = arrayPrototype[methodName];
    // 定义新的方法
    def(arrayMathods, methodName, function() {
        let ob = this.__ob__;
        // push,unshift,splice新增数据响应式
        let inserted = [];
        switch (methodName) {
            case 'push':
            case 'unshift':
                inserted = [...arguments];
                break;
            case 'splice':
                inserted = [...arguments].slice(2);

        }
        if (inserted.length > 0) {
            // 新增项变成响应的
            ob.observeArray(inserted);
        }
        let result = original.apply(this, arguments);
        ob.dep.notify();
        return result;

    }, false)
})